home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / dev / mui / bcc_src.lha / Parser / ParseBH.cpp.bak < prev    next >
Text File  |  1997-06-05  |  6KB  |  364 lines

  1. #include "ParseBH.h"
  2. #include "MethodDef.h"
  3. #include "ClassDef.h"
  4. #include "Global.h"
  5.  
  6. #include "VarDef.h"
  7.  
  8. #include <string.h>
  9.  
  10. short ParseBH::Start( void )
  11. {
  12.  
  13.     IfDefBeg();
  14.     
  15.     ins_every.Insert( ofh );
  16.     ins_header.Insert( ofh );
  17.  
  18.     while( 1 ) {
  19.     
  20.         GetToken();
  21.         if( !TokLen ) break;
  22.         
  23.         if( TokLen == 5 && !strncmp( "Class", Tok, 5 ) ) {
  24.             if( !DoClass() ) {
  25.                 if( !ErrorBuf ) Error( 12 );
  26.                 return 0;
  27.             }
  28.         } else 
  29.         if( TokLen == 7 && !strncmp( "include", Tok, 7 ) ) {
  30.             if( !DoHeader() ) {
  31.                 if( !ErrorBuf ) Error( 12 );
  32.                 return 0;
  33.             }
  34.         } else SetCType();
  35.  
  36.     }
  37.  
  38.     IfDefEnd();
  39.  
  40.     return 1;
  41.  
  42. }
  43.  
  44. short ParseBH::DoClass( void )
  45. {
  46.  short BLevel;
  47.  
  48.     StopCopy();
  49.  
  50.     GetToken();
  51.     if( !TokLen ) return 0;
  52.         
  53.     if( strlen( sfname ) != TokLen || strncmp( sfname, Tok, strlen( sfname ) )  ) {
  54.         Error( 1 );
  55.         return 0;
  56.     }
  57.  
  58.     ClassDef *cd;
  59.     
  60.     cd = new ClassDef( Tok, TokLen );
  61.  
  62.     ClassList.AddTail( (Family*)cd );
  63.  
  64.     classdef = cd;
  65.     cd->type = ctype;
  66.  
  67.     BLevel = MBracket;
  68.  
  69.     GetToken();
  70.     if( !TokLen ) return 0;
  71.  
  72.     /* Super class */
  73.     if( chcmp( ':' ) ) {
  74.  
  75.         GetToken();
  76.         if( !TokLen ) return 0;
  77.  
  78.         if( TokLen == 7 && !strncmp( "private", Tok, 7 ) ) {
  79.  
  80.             cd->superpriv = 1;
  81.  
  82.             GetToken();
  83.             if( !TokLen ) return 0;
  84.  
  85.         }
  86.  
  87.         memcpy( cd->PSuper, Tok, min( TokLen, 30 ) );
  88.         cd->PSuper[ min( TokLen, 30 ) ] = 0;
  89.  
  90.         GetToken();
  91.         if( !TokLen ) return 0;
  92.  
  93.     } else {
  94.         switch( *cd->type ) {
  95.             case 'B':
  96.                 strcpy( cd->PSuper, "\"rootclass\"" );
  97.                 break;
  98.             default:
  99.                 strcpy( cd->PSuper, "MUIC_Notify" );
  100.         }
  101.     }
  102.  
  103.     if( !chcmp( '{' ) ) {
  104.         Error( 2 );
  105.         return 0;
  106.     }
  107.     
  108.     fprintf( ofh, "typedef struct {\n" ); 
  109.  
  110.     StartCopy();
  111.  
  112.     short nods = 0, crcont = 0;
  113.     char crClName[30];
  114.  
  115.     short virt = 0;
  116.         
  117.     while( 1 ) {
  118.     
  119.         next:    
  120.         GetToken();
  121.         if( !TokLen ) return 0;
  122.  
  123.         if( chcmp( '}' ) && MBracket == BLevel ) break;
  124.  
  125.         SetCType();
  126.  
  127.         /* Class references */
  128.         if( crcont == 1 ) {
  129.             if( !chcmp( '*' ) ) {
  130.                 Error( 15 );
  131.                 return 0;
  132.             }
  133.             crcont = 2;
  134.             goto next;
  135.         }
  136.         if( crcont == 2 ) {
  137.             if( TokType != ALN ) {
  138.                 Error( 4 );
  139.                 return 0;
  140.             }
  141.             cd->clref.Add( Tok, TokLen, crClName, 0 );
  142.             crcont = 3;
  143.             goto next;
  144.         }
  145.  
  146.         if( !crcont && (TokLen == 5) && !strncmp( Tok, "Class", 5 ) ) {
  147.  
  148.             StopCopy();
  149.  
  150.             GetToken();
  151.             if( !TokLen ) return 0;
  152.  
  153.             strcpy( crClName, ctype );
  154.             memcpy( crClName+3, Tok, TokLen );
  155.             crClName[TokLen+3] = 0;
  156.  
  157.             crcont = 1;
  158.             fprintf( ofh, "Object" );
  159.             StartCopy();
  160.  
  161.             goto next;
  162.  
  163.         }
  164.         
  165.         /* shortcuts to data variables */
  166.         if( ( chcmp( ',' ) || chcmp( ';' ) || chcmp( ':' ) || chcmp( '[') ) && PrevTok[0] && (PrevType == ALN) && !nods ) {
  167.             char opbuf[60];
  168.             strcpy( opbuf, "(data->" );
  169.             strcpy( opbuf + 7, PrevTok );
  170.             strcpy( opbuf + strlen( opbuf ), ")" );
  171.             cd->rep.Add( PrevTok, 0, opbuf, 0 );
  172.  
  173.         }
  174.         nods = 0;
  175.  
  176.         /* Set Get Init variables */
  177.         if( chcmp( ':' ) && PrevTok[ 0 ] ) {
  178.             StopCopy();
  179.  
  180.             char AttrName[30];
  181.             strcpy( AttrName, PrevTok );
  182.  
  183.             GetToken();
  184.             if( !TokLen ) return 0;
  185.  
  186.             if( TokType != ALN || TokLen > 3 ) {
  187.                 Error( 9 );
  188.                 return 0;
  189.             }
  190.  
  191.             VarDef *vd = new VarDef( AttrName, Tok, TokLen, cd->GetTagVal() );
  192.             cd->Var.AddTail( (Family*)vd );
  193.  
  194.             nods = 1;
  195.  
  196.             StartCopy();
  197.  
  198.             goto next;
  199.         }
  200.  
  201.         /* Method definition */
  202.         if( TokLen == 6 && !strncmp( Tok, "Method", 6 ) ) {
  203.             StopCopy();
  204.  
  205.             GetToken();
  206.             if( !TokLen ) return 0;
  207.  
  208.             if( TokType != ALN ) {
  209.                 Error( 4 );
  210.                 return 0;
  211.             }            
  212.  
  213.             MethodDef *md;
  214.             md = new MethodDef( Tok, TokLen );
  215.  
  216.             md->virt = virt;
  217.  
  218.             short CLevel = CBracket;
  219.             
  220.             GetToken();
  221.             if( !TokLen ) return 0;
  222.             
  223.             if( !chcmp( '(' ) ) {
  224.                 Error( 5 );
  225.                 return 0;
  226.             }
  227.             
  228.             while( 1 ) {
  229.  
  230.                 GetToken();
  231.                 if( !TokLen ) return 0;
  232.                 
  233.                 if( chcmp( ')' ) && CBracket == CLevel ) break;
  234.         
  235.             }
  236.  
  237.             GetToken();
  238.             if( !TokLen ) return 0;
  239.             
  240.             if( !chcmp( ';' ) ) {
  241.                 Error( 3 );
  242.                 return 0;
  243.             }
  244.             
  245.             cd->AddTail( (Family*)md );
  246.             
  247.             StartCopy();
  248.         } else {
  249.         /* Attribute definition */
  250.         if( TokLen == 9 && !strncmp( "Attribute", Tok, 9 ) ) {
  251.             StopCopy();
  252.  
  253.             GetToken();
  254.             if( !TokLen ) return 0;
  255.  
  256.             if( TokType != ALN ) {
  257.                 Error( 4 );
  258.                 return 0;
  259.             }            
  260.  
  261.             GetToken();
  262.             if( !TokLen ) return 0;
  263.  
  264.             VarDef *vd1;
  265.  
  266.             if( chcmp( ':' ) ) {
  267.  
  268.                 char AttrName[30];
  269.                 strcpy( AttrName, PrevTok );
  270.  
  271.                 GetToken();
  272.                 if( !TokLen ) return 0;
  273.  
  274.                 if( TokType != ALN || TokLen > 3 ) {
  275.                     Error( 9 );
  276.                     return 0;
  277.                 }
  278.  
  279.                 vd1 = new VarDef( AttrName, Tok, TokLen, cd->GetTagVal(), 0 );
  280.  
  281.                 vd1->virt = virt;
  282.  
  283.                 GetToken();
  284.                 if( !TokLen ) return 0;
  285.  
  286.             } else {
  287.                 vd1 = new VarDef( PrevTok, "S", 1, cd->GetTagVal(), 0 );
  288.             }
  289.  
  290.             cd->Var.AddTail( (Family*)vd1 );
  291.             
  292.             if( !chcmp( ';' ) ) {
  293.                 Error( 3 );
  294.                 return 0;
  295.             }
  296.             
  297.             StartCopy();
  298.  
  299.         }
  300.         }
  301.  
  302.         /* Virtual methods/attributes */
  303.         if( TokLen == 7 && !strncmp( "virtual", Tok, 7 ) ) {
  304.             StopCopy();
  305.             StartCopy();
  306.             virt = 1;
  307.             goto next;
  308.         }
  309.         virt = 0;
  310.  
  311.         /* crcont */
  312.         if( crcont == 3 ) {
  313.             if( chcmp( ';' ) ) crcont = 0;
  314.             else {
  315.                 if( chcmp( ',' ) ) crcont = 1;
  316.                 else {
  317.                     printf( "%s\n", Tok );
  318.                     Error( 16 );
  319.                     return 0;
  320.                 }
  321.             }
  322.         }
  323.  
  324.     }
  325.  
  326.     StopCopy();
  327.  
  328.     GetToken();
  329.     if( !TokLen ) return 0;
  330.         
  331.     if( TokLen != 1 || *Tok != ';' ) {    
  332.         Error( 3 );
  333.         return 0;
  334.     }
  335.     
  336.     fprintf( ofh, "} %sData;\n\n/* Method Tags */\n", sfname );
  337.     
  338.     FScan( MethodDef, child, cd ) {
  339.         fprintf( ofh, "#define %sM_%s_%s 0x%lx\n", cd->type, cd->Name, child->Name, child->GetTagVal() );
  340.     }
  341.  
  342.     fprintf( ofh, "\n" );
  343.  
  344.     FScan( VarDef, child1, &(cd->Var) ) {
  345.         fprintf( ofh, "#define %sA_%s_%s 0x%lx\n", cd->type, cd->Name, child1->Name, child1->GetTagVal() );
  346.     }
  347.  
  348.     switch( *cd->type ) {
  349.         case 'B':
  350.             fprintf( ofh, "\nextern struct IClass *cl_%s;\n#define %sObject NewObject( cl_%s, NULL\n", cd->Name, cd->Name, cd->Name );
  351.             fprintf( ofh, "struct IClass *%s_Create( void );\n", cd->Name );
  352.             break;
  353.         default:
  354.             fprintf( ofh, "\nextern struct MUI_CustomClass *cl_%s;\n#define %sObject NewObject( cl_%s->mcc_Class, NULL\n", cd->Name, cd->Name, cd->Name );
  355.             fprintf( ofh, "struct MUI_CustomClass *%s_Create( void );\n", cd->Name );
  356.  
  357.     }
  358.  
  359.     StartCopy();
  360.         
  361.       return 1;
  362.     
  363. }
  364.